home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 06 - 1990 / 06.08 Aug 90 / LSObjectShell / MyMenus.p < prev    next >
Encoding:
Text File  |  1989-09-26  |  13.3 KB  |  581 lines  |  [TEXT/PJMM]

  1. UNIT MyMenus;
  2. {***********************************}
  3. INTERFACE
  4.  
  5.     USES
  6.         MemTypes, QuickDraw, OSIntf, ToolIntf, PackIntf, MacPrint, ObjIntf, GlobalStuff, StdWindows, StdMenus, MyDocuments;
  7.  
  8.     TYPE
  9.         TSubMenu = OBJECT(TMenu)
  10.                 PROCEDURE Create (vRsrcID: Integer);
  11.                 override;
  12.             END;
  13.  
  14.         TNewMenu = OBJECT(TSubMenu)
  15.                 PROCEDURE Choose (vItem: Integer);
  16.                 override;
  17.             END;
  18.  
  19.         TNewPictMenu = OBJECT(TNewMenu)
  20.                 PROCEDURE Choose (vItem: Integer);
  21.                 override;
  22.             END;
  23.  
  24.         TNewTextMenu = OBJECT(TNewMenu)
  25.                 PROCEDURE Choose (vItem: Integer);
  26.                 override;
  27.             END;
  28.  
  29.         TGraphMenu = OBJECT(TMenu)
  30.                 PROCEDURE Choose (vItem: Integer);
  31.                 override;
  32.             END;
  33.  
  34.         TColorMenu = OBJECT(TMenu)
  35.             END;
  36.  
  37.         TForeCMenu = OBJECT(TSubMenu)
  38.                 PROCEDURE Choose (vItem: Integer);
  39.                 override;
  40.             END;
  41.  
  42.         TBackCMenu = OBJECT(TSubMenu)
  43.                 PROCEDURE Choose (vItem: Integer);
  44.                 override;
  45.             END;
  46.  
  47.         TTextMenu = OBJECT(TMenu)
  48.             END;
  49.  
  50.         TFontMenu = OBJECT(TSubMenu)
  51.                 PROCEDURE Create (vRsrcID: Integer);
  52.                 override;
  53.                 PROCEDURE Choose (vItem: Integer);
  54.                 override;
  55.             END;
  56.  
  57.         TSizeMenu = OBJECT(TSubMenu)
  58.                 PROCEDURE Choose (vItem: Integer);
  59.                 override;
  60.             END;
  61.  
  62.         TStyleMenu = OBJECT(TSubMenu)
  63.                 PROCEDURE Choose (vItem: Integer);
  64.                 override;
  65.             END;
  66.  
  67.         TJustMenu = OBJECT(TSubMenu)
  68.                 PROCEDURE Choose (vItem: Integer);
  69.                 override;
  70.             END;
  71.  
  72.     VAR
  73.         oNewMenu: TNewMenu;
  74.         oNewPictMenu: TNewPictMenu;
  75.         oNewTextMenu: TNewTextMenu;
  76.         oGraphMenu: TGraphMenu;
  77.         oColorMenu: TColorMenu;
  78.         oForeCMenu: TForeCMenu;
  79.         oBackCMenu: TBackCMenu;
  80.         oTextMenu: TTextMenu;
  81.         oFontMenu: TFontMenu;
  82.         oSizeMenu: TSizeMenu;
  83.         oStyleMenu: TStyleMenu;
  84.         oJustMenu: TJustMenu;
  85.  
  86.     PROCEDURE InitMyMenus;
  87.     PROCEDURE ClickInMyMenus (vMenu, vItem: Integer);
  88.     PROCEDURE SetMyMenuItems;
  89.     PROCEDURE SetMyMenuBar;
  90.     PROCEDURE DisposeMyMenus;
  91.  
  92. {***********************************}
  93. IMPLEMENTATION
  94.  
  95.     PROCEDURE SetCheckMark (vMenuHdl: MenuHandle;
  96.                                     vItem: Integer);
  97.         VAR
  98.             vMaxMItem: Integer;
  99.             i: Integer;
  100.  
  101.     BEGIN
  102.         vMaxMItem := CountMItems(vMenuHdl);
  103.         FOR i := 1 TO vMaxMItem DO
  104.             CheckItem(vMenuHdl, i, (i = vItem));
  105.     END;    {SetCheckMark}
  106.  
  107. {----------------------------------------}
  108.     PROCEDURE OutlineFontSize (vFontNumber: Integer);
  109.         VAR
  110.             vSizeMenu: MenuHandle;
  111.             vSizeName: Str255;
  112.             vSizeNumber: LongInt;
  113.             i: Integer;
  114.  
  115.     BEGIN
  116.         vSizeMenu := oSizeMenu.fMenuHdl;
  117.         FOR i := 1 TO CountMItems(vSizeMenu) DO
  118.             BEGIN
  119.                 GetItem(vSizeMenu, i, vSizeName);
  120.                 StringToNum(vSizeName, vSizeNumber);
  121.                 IF RealFont(vFontNumber, vSizeNumber) THEN
  122.                     SetItemStyle(vSizeMenu, i, [Outline])
  123.                 ELSE
  124.                     SetItemStyle(vSizeMenu, i, []);
  125.             END;
  126.     END;    {OutlineFontSize}
  127.  
  128. {----------------------------------------}
  129.     PROCEDURE CheckFontMenu (vMenuHdl: MenuHandle);
  130.         VAR
  131.             vMaxMItem: Integer;
  132.             vFontName: Str255;
  133.             vFontNumber: Integer;
  134.             vCurrentFont: Str255;
  135.             i: Integer;
  136.  
  137.     BEGIN
  138.         vMaxMItem := CountMItems(vMenuHdl);
  139.         GetFontName(thePort^.txFont, vCurrentFont);
  140.         FOR i := 1 TO vMaxMItem DO
  141.             BEGIN
  142.                 GetItem(vMenuHdl, i, vFontName);
  143.                 IF vFontName = vCurrentFont THEN
  144.                     BEGIN
  145.                         SetCheckMark(vMenuHdl, i);
  146.                         GetFNum(vFontName, vFontNumber);
  147.                         OutlineFontSize(vFontNumber);
  148.                         leave;
  149.                     END;
  150.             END;
  151.     END;    {CheckFontMenu}
  152.  
  153. {----------------------------------------}
  154.     PROCEDURE CheckSizeMenu (vMenuHdl: MenuHandle);
  155.         VAR
  156.             vMaxMItem: Integer;
  157.             vSizeName: Str255;
  158.             vSizeNumber: LongInt;
  159.             vCurrentSize: Integer;
  160.             i: Integer;
  161.  
  162.     BEGIN
  163.         vMaxMItem := CountMItems(vMenuHdl);
  164.         vCurrentSize := thePort^.txSize;
  165.         FOR i := 1 TO vMaxMItem DO
  166.             BEGIN
  167.                 GetItem(vMenuHdl, i, vSizeName);
  168.                 StringToNum(vSizeName, vSizeNumber);
  169.                 IF LoWord(vSizeNumber) = vCurrentSize THEN
  170.                     BEGIN
  171.                         SetCheckMark(vMenuHdl, i);
  172.                         leave;
  173.                     END;
  174.             END;
  175.     END;    {CheckSizeMenu}
  176.  
  177. {----------------------------------------}
  178.     PROCEDURE CheckStyleMenu (vMenuHdl: MenuHandle);
  179.         VAR
  180.             i: Integer;
  181.             vStylePtr: Ptr;
  182.  
  183.     BEGIN
  184.         vStylePtr := oWindow.oDocument.fMyHdl^;
  185.         FOR i := kPlain TO kExtend DO
  186.             CheckItem(vMenuHdl, i, BitTst(vStylePtr, i - 1))
  187.     END;    {CheckStyleMenu}
  188.  
  189. {----------------------------------------}
  190.     PROCEDURE CheckJustMenu (vMenuHdl: MenuHandle);
  191.         VAR
  192.             vJust: Integer;
  193.             vItem: Integer;
  194.  
  195.     BEGIN
  196.         vJust := oWindow.oDocument.fTextHdl^^.just;
  197.         CASE vJust OF
  198.             teJustLeft: 
  199.                 vItem := kLeft;
  200.             teJustCenter: 
  201.                 vItem := kCenter;
  202.             OTHERWISE
  203.                 vItem := kRight;
  204.         END;
  205.         SetCheckMark(vMenuHdl, vItem);
  206.     END;    {CheckJustMenu}
  207.  
  208. {----------------------------------------}
  209.     PROCEDURE SwitchMenus (vPictFlag, vTextFlag: BOOLEAN);
  210.  
  211.         PROCEDURE DoInsertMenu (vMenuHdl: MenuHandle;
  212.                                         vRsrcID: Integer;
  213.                                         vFlag: BOOLEAN);
  214.         BEGIN
  215.             IF vFlag THEN
  216.                 InsertMenu(vMenuHdl, 0)
  217.             ELSE
  218.                 DeleteMenu(vRsrcID);
  219.         END;    {DoInsertMenu}
  220.  
  221. {-  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -}
  222.     BEGIN
  223.         IF vPictFlag = FALSE THEN
  224.             BEGIN
  225.                 DoInsertMenu(oGraphMenu.fMenuHdl, kGraphID, vPictFlag);
  226.                 DoInsertMenu(oColorMenu.fMenuHdl, kColorID, vPictFlag);
  227.                 DoInsertMenu(oTextMenu.fMenuHdl, kTextID, vTextFlag);
  228.                 DoInsertMenu(oColorMenu.fMenuHdl, kColorID, vTextFlag);
  229.  
  230.                 IF vTextFlag = TRUE THEN
  231.                     BEGIN
  232.                         CheckFontMenu(oFontMenu.fMenuHdl);
  233.                         CheckSizeMenu(oSizeMenu.fMenuHdl);
  234.                         CheckStyleMenu(oStyleMenu.fMenuHdl);
  235.                         CheckJustMenu(oJustMenu.fMenuHdl);
  236.                         WITH oWindow.oDocument DO
  237.                             BEGIN
  238.                                 SetCheckMark(oForeCMenu.fMenuHdl, fForeC);
  239.                                 SetCheckMark(oBackCMenu.fMenuHdl, fBackC);
  240.                             END;
  241.                     END;
  242.             END
  243.         ELSE
  244.             BEGIN
  245.                 DoInsertMenu(oTextMenu.fMenuHdl, kTextID, vTextFlag);
  246.                 DoInsertMenu(oColorMenu.fMenuHdl, kColorID, vTextFlag);
  247.                 DoInsertMenu(oGraphMenu.fMenuHdl, kGraphID, vPictFlag);
  248.                 DoInsertMenu(oColorMenu.fMenuHdl, kColorID, vPictFlag);
  249.                 WITH oWindow.oDocument DO
  250.                     BEGIN
  251.                         SetCheckMark(oGraphMenu.fMenuHdl, fShapeID);
  252.                         SetCheckMark(oForeCMenu.fMenuHdl, fForeC);
  253.                         SetCheckMark(oBackCMenu.fMenuHdl, fBackC);
  254.                     END;
  255.             END;
  256.     END;    {SwitchMenus}
  257.  
  258. {========================================}
  259.     PROCEDURE InitMyMenus;
  260.     BEGIN
  261.         New(oNewMenu);
  262.         oNewMenu.Create(kNewID);
  263.  
  264.         New(oNewPictMenu);
  265.         oNewPictMenu.Create(kNewPictID);
  266.  
  267.         New(oNewTextMenu);
  268.         oNewTextMenu.Create(kNewTextID);
  269.  
  270.         New(oGraphMenu);
  271.         oGraphMenu.Create(kGraphID);
  272.  
  273.         New(oColorMenu);
  274.         oColorMenu.Create(kColorID);
  275.  
  276.         New(oForeCMenu);
  277.         oForeCMenu.Create(kForeCID);
  278.  
  279.         New(oBackCMenu);
  280.         oBackCMenu.Create(kBackCID);
  281.  
  282.         New(oTextMenu);
  283.         oTextMenu.Create(kTextID);
  284.  
  285.         New(oFontMenu);
  286.         oFontMenu.Create(kFontID);
  287.  
  288.         New(oSizeMenu);
  289.         oSizeMenu.Create(kSizeID);
  290.  
  291.         New(oStyleMenu);
  292.         oStyleMenu.Create(kStyleID);
  293.  
  294.         New(oJustMenu);
  295.         oJustMenu.Create(kJustID);
  296.  
  297.         SwitchMenus(FALSE, FALSE);
  298.     END;    {InitMyMenus}
  299.  
  300. {========================================}
  301.     PROCEDURE ClickInMyMenus (vMenu, vItem: Integer);
  302.     BEGIN
  303.         CASE vMenu OF
  304.             kNewPictID: 
  305.                 oNewPictMenu.Choose(vItem);
  306.             kNewTextID: 
  307.                 oNewTextMenu.Choose(vItem);
  308.             kGraphID: 
  309.                 oGraphMenu.Choose(vItem);
  310.             kForeCID: 
  311.                 oForeCMenu.Choose(vItem);
  312.             kBackCID: 
  313.                 oBackCMenu.Choose(vItem);
  314.             kFontID: 
  315.                 oFontMenu.Choose(vItem);
  316.             kSizeID: 
  317.                 oSizeMenu.Choose(vItem);
  318.             kStyleID: 
  319.                 oStyleMenu.Choose(vItem);
  320.             kJustID: 
  321.                 oJustMenu.Choose(vItem);
  322.             OTHERWISE
  323.         END;
  324.     END;    {ClickInMyMenus}
  325.  
  326. {========================================}
  327.     PROCEDURE SetMyMenuItems;
  328.         VAR
  329.             vFrontWFlag: BOOLEAN;
  330.             vUserWFlag: BOOLEAN;
  331.  
  332.     BEGIN
  333.         vFrontWFlag := (FrontWindow <> NIL);
  334.         vUserWFlag := IsAppWindow(FrontWindow);
  335. {Enable/disable items of MyMenus}
  336.     END;    {SetMyMenuItems}
  337.  
  338. {========================================}
  339.     PROCEDURE SetMyMenuBar;
  340.         VAR
  341.             vFrontWFlag: BOOLEAN;
  342.             vUserWFlag: BOOLEAN;
  343.             vDocType: OSType;
  344.  
  345.     BEGIN
  346.         vFrontWFlag := (FrontWindow <> NIL);
  347.         vUserWFlag := IsAppWindow(FrontWindow);
  348.         IF NOT vFrontWFlag THEN
  349.             SwitchMenus(FALSE, FALSE);
  350.         IF vUserWFlag THEN
  351.             BEGIN
  352.                 oWindow := TWindow(GetWRefCon(FrontWindow));
  353.                 vDocType := oWindow.oDocument.fDocType;
  354.                 IF vDocType = kPictDoc THEN
  355.                     SwitchMenus(TRUE, FALSE)
  356.                 ELSE IF vDocType = kTextDoc THEN
  357.                     SwitchMenus(FALSE, TRUE);
  358.             END
  359.         ELSE
  360. {SwitchMenus(FALSE, FALSE)}
  361.             ;
  362.         SetEnable(kEditID, 0, vFrontWFlag);
  363.         SetEnable(kGraphID, 0, vUserWFlag);
  364.         SetEnable(kTextID, 0, vUserWFlag);
  365.         SetEnable(kColorID, 0, vUserWFlag);
  366.         DrawMenuBar;
  367.     END;    {SetMyMenuBar}
  368.  
  369. {========================================}
  370.     PROCEDURE DisposeMyMenus;
  371.     BEGIN
  372.         oNewMenu.Free;
  373.         oNewPictMenu.Free;
  374.         oNewTextMenu.Free;
  375.         oGraphMenu.Free;
  376.         oColorMenu.Free;
  377.         oForeCMenu.Free;
  378.         oBackCMenu.Free;
  379.         oTextMenu.Free;
  380.         oFontMenu.Free;
  381.         oSizeMenu.Free;
  382.         oStyleMenu.Free;
  383.         oJustMenu.Free;
  384.     END;    {DisposeMyMenus}
  385.  
  386. {========================================}
  387.     PROCEDURE TSubMenu.Create (vRsrcID: Integer);
  388.     BEGIN
  389.         HLock(Handle(Self));
  390.         fMenuHdl := GetMenu(vRsrcID);
  391.         InsertMenu(fMenuHdl, -1);
  392.         HUnlock(Handle(Self));
  393.     END; {Create}
  394.  
  395. {========================================}
  396.     PROCEDURE TNewMenu.Choose (vItem: Integer);
  397.     BEGIN
  398.         CASE vItem OF
  399.             kNoGrow: 
  400.                 New(TWindow(oWindow));
  401.             kGrow: 
  402.                 New(TGrowWindow(oWindow));
  403.             kHScroll..kScroll: 
  404.                 New(TScrollWindow(oWindow));
  405.             kHScrollZoom..kScrollZoom: 
  406.                 IF BitTst(Ptr(ROM85), 0) THEN
  407.                     New(TScrollWindow(oWindow))
  408.                 ELSE
  409.                     New(TScrollZoomWindow(oWindow));
  410.             OTHERWISE
  411.         END;
  412.         oWindow.fWKind := vItem;
  413.     END; {Choose}
  414.  
  415. {----------------------------------------}
  416.     PROCEDURE TNewPictMenu.Choose (vItem: Integer);
  417.     BEGIN
  418.         INHERITED Choose(vItem);
  419.         oWindow.DoNew(kPictDoc);
  420.         ShowWindow(oWindow.fWPtr);
  421.         SetCheckMark(oForeCMenu.fMenuHdl, kBlack);
  422.         SetCheckMark(oBackCMenu.fMenuHdl, kWhite);
  423.     END; {Choose}
  424.  
  425. {----------------------------------------}
  426.     PROCEDURE TNewTextMenu.Choose (vItem: Integer);
  427.     BEGIN
  428.         INHERITED Choose(vItem);
  429.         oWindow.DoNew(kTextDoc);
  430.         ShowWindow(oWindow.fWPtr);
  431.         CheckFontMenu(oFontMenu.fMenuHdl);
  432.         CheckSizeMenu(oSizeMenu.fMenuHdl);
  433.         CheckStyleMenu(oStyleMenu.fMenuHdl);
  434.         SetCheckMark(oJustMenu.fMenuHdl, kLeft);
  435.         SetCheckMark(oForeCMenu.fMenuHdl, kBlack);
  436.         SetCheckMark(oBackCMenu.fMenuHdl, kWhite);
  437.     END; {Choose}
  438.  
  439. {========================================}
  440.     PROCEDURE TGraphMenu.Choose (vItem: Integer);
  441.     BEGIN
  442.         oWindow := TWindow(GetWRefCon(FrontWindow));
  443.         oWindow.oDocument.fShapeID := vItem;
  444.         SetCheckMark(fMenuHdl, vItem);
  445.     END; {Choose}
  446.  
  447. {========================================}
  448.     PROCEDURE TForeCMenu.Choose (vItem: Integer);
  449.     BEGIN
  450.         oWindow := TWindow(GetWRefCon(FrontWindow));
  451.         oWindow.oDocument.fForeC := vItem;
  452.         oWindow.ReDrawContent;
  453.         SetCheckMark(fMenuHdl, vItem);
  454.     END; {Choose}
  455.  
  456. {----------------------------------------}
  457.     PROCEDURE TBackCMenu.Choose (vItem: Integer);
  458.     BEGIN
  459.         oWindow := TWindow(GetWRefCon(FrontWindow));
  460.         oWindow.oDocument.fBackC := vItem;
  461.         oWindow.ReDrawContent;
  462.         SetCheckMark(fMenuHdl, vItem);
  463.     END; {Choose}
  464.  
  465. {========================================}
  466.     PROCEDURE TFontMenu.Create (vRsrcID: Integer);
  467.     BEGIN
  468.         HLock(Handle(Self));
  469.         fMenuHdl := GetMenu(vRsrcID);
  470.         AddResMenu(fMenuHdl, 'FONT');
  471.         InsertMenu(fMenuHdl, -1);
  472.         HUnlock(Handle(Self));
  473.     END; {Create}
  474.  
  475. {----------------------------------------}
  476.     PROCEDURE TFontMenu.Choose (vItem: Integer);
  477.         VAR
  478.             vFontName: Str255;
  479.             vFontNumber: Integer;
  480.  
  481.     BEGIN
  482.         GetItem(fMenuHdl, vItem, vFontName);
  483.         GetFNum(vFontName, vFontNumber);
  484.         TextFont(vFontNumber);
  485.         oWindow := TWindow(GetWRefCon(FrontWindow));
  486.         oWindow.oDocument.fTextHdl^^.txFont := vFontNumber;
  487.         oWindow.ReDrawContent;
  488.         SetCheckMark(fMenuHdl, vItem);
  489.         OutlineFontSize(vFontNumber);
  490.     END; {Choose}
  491.  
  492. {========================================}
  493.     PROCEDURE TSizeMenu.Choose (vItem: Integer);
  494.         VAR
  495.             vSizeName: Str255;
  496.             vSizeNumber: LongInt;
  497.  
  498.     BEGIN
  499.         GetItem(fMenuHdl, vItem, vSizeName);
  500.         StringToNum(vSizeName, vSizeNumber);
  501.         TextSize(LoWord(vSizeNumber));
  502.         oWindow := TWindow(GetWRefCon(FrontWindow));
  503.         oWindow.oDocument.fTextHdl^^.txSize := LoWord(vSizeNumber);
  504.         oWindow.ReDrawContent;
  505.         SetCheckMark(fMenuHdl, vItem);
  506.     END; {Choose}
  507.  
  508. {========================================}
  509.     PROCEDURE TStyleMenu.Choose (vItem: Integer);
  510.         VAR
  511.             vStyle: Style;
  512.             vStylePtr: Ptr;
  513.     BEGIN
  514.         oWindow := TWindow(GetWRefCon(FrontWindow));
  515.         WITH oWindow.oDocument DO
  516.             BEGIN
  517.                 vStylePtr := fMyHdl^;
  518.                 vStyle := [];
  519.                 CASE vItem OF
  520.                     kPlain: 
  521.                         BEGIN
  522.                             TextFace([]);
  523.                             fMyHdl^^ := -128;
  524.                         END;
  525.                     kBold: 
  526.                         vStyle := [Bold];
  527.                     kItalic: 
  528.                         vStyle := [Italic];
  529.                     kUnderline: 
  530.                         vStyle := [Underline];
  531.                     kOutline: 
  532.                         vStyle := [Outline];
  533.                     kShadow: 
  534.                         vStyle := [Shadow];
  535.                     kCondense: 
  536.                         vStyle := [Condense];
  537.                     kExtend: 
  538.                         vStyle := [Extend];
  539.                     OTHERWISE
  540.                 END;
  541.                 IF (vStyle <= thePort^.txFace) AND (vItem <> kPlain) THEN
  542.                     BEGIN
  543.                         TextFace(thePort^.txFace - vStyle);
  544.                         BitClr(vStylePtr, vItem - 1);
  545.                     END
  546.                 ELSE
  547.                     BEGIN
  548.                         TextFace(thePort^.txFace + vStyle);
  549.                         BitClr(vStylePtr, kPlain - 1);
  550.                         BitSet(vStylePtr, vItem - 1);
  551.                     END;
  552.                 fTextHdl^^.txFace := thePort^.txFace;
  553.                 fMyHdl^^ := vStylePtr^;
  554.             END;
  555.         oWindow.ReDrawContent;
  556.         CheckStyleMenu(fMenuHdl);
  557.     END; {Choose}
  558.  
  559. {========================================}
  560.     PROCEDURE TJustMenu.Choose (vItem: Integer);
  561.         VAR
  562.             vJust: Integer;
  563.  
  564.     BEGIN
  565.         oWindow := TWindow(GetWRefCon(FrontWindow));
  566.         CASE vItem OF
  567.             kLeft: 
  568.                 vJust := teJustLeft;
  569.             kCenter: 
  570.                 vJust := teJustCenter;
  571.             kRight: 
  572.                 vJust := teJustRight;
  573.             OTHERWISE
  574.         END;
  575.         oWindow.oDocument.fTextHdl^^.just := vJust;
  576.         oWindow.ReDrawContent;
  577.         SetCheckMark(fMenuHdl, vItem);
  578.     END; {Choose}
  579.  
  580. END. {unit MyMenus}
  581. {***********************************}